package com.uinnova.product.eam.service;

import com.binary.framework.bean.annotation.Comment;
import com.binary.jdbc.Page;
import com.uinnova.product.eam.constant.ArchReviewState;
import com.uinnova.product.eam.constant.FeatureReviewType;
import com.uinnova.product.eam.constant.ItemType;
import com.uinnova.product.eam.dto.SimpPlanInfo;
import com.uinnova.product.eam.model.cj.domain.PlanDesignInstance;
import com.uinnova.product.eam.model.es.ArchReviewInfo;
import com.uinnova.product.eam.vo.*;

import java.util.List;

@Comment("架构评审")
public interface ArchReviewService {

    /**
     * 架构评审-方案内提交评审后前置信息
     * @param planId
     * @return
     */
    ArchReviewSubmitBeforeInfo submitBeforeInfo(Long planId);

    /**
     * 架构评审提交
     * @param req
     * @return
     */
    ArchReviewSubmitRes submit(ArchReviewSubmitReq req);

    /**
     * 查询可评审的方案列表
     * @param req
     * @return
     */
    Page<SimpPlanInfo> reviewPlans(ReviewPlanReq req);

    /**
     * 通过id获取评审信息
     * @param id
     * @return
     */
    ArchReviewInfo getById(Long id);

    /**
     * 更新后续评审方式
     * @param id 架构评审id
     * @param featureReviewType 后续评审方式
     * @param stage 当前流程节点
     */
    void updateFeatureReviewType(Long id, FeatureReviewType featureReviewType, String stage);

    /**
     * 更新架构评审流程状态
     * @param id
     * @param state
     */
    void updateArchReviewState(Long id, ArchReviewState state);

    /**
     * 通过流程实例id查架构评审信息
     * @param processInstanceId
     */
    ArchReviewInfo getArchReviewByProcessInstanceId(String processInstanceId);

    /**
     * 更新受理时间
     * @param id
     */
    void updateAcceptTimeIfEmpty(Long id);

    /**
     * 更新“预评审-值班人评审”节点处理人
     * @param id
     * @param preReviewOfficer
     */
    void updatePreReviewOfficer(Long id, String preReviewOfficer);

    /**
     * 架构评审流程信息
     * @param taskId
     * @return
     */
    ArchReviewApproveInfo approveInfo(String taskId);

    /**
     * 架构评审流程信息
     * @param id
     * @return
     */
    ArchReviewApproveInfo approveInfo(Long id);

    /**
     * 保存或更新架构评审信息
     * @param archReviewInfo
     */
    void saveOrUpdate(ArchReviewInfo archReviewInfo);

    /**
     * 架构评审列表
     * @param req
     * @return
     */
    Page<ArchReviewRes> page(ArchReviewQueryReq req);

    /**
     * 传阅
     * @param req
     */
    void circulate(CirculateReq req);

    /**
     * 传阅列表
     * @param req
     * @return
     */
    Page<CirculateListRes> cirCulateList(CirculateListReq req);

    /**
     * 关闭传阅待办
     * @param workbenchChargeDoneId
     */
    void finishCirculateJob(Long workbenchChargeDoneId);

    /**
     * 根据方案审批状态 同步更新关联的项目资产属性
     * @param itemType 事项类型:项目
     * @param projectCiCode 项目ciCode
     * @param plans 架构设计方案集合
     * @param state 架构评审状态
     * @param reviewId 评审ID:流程id
     * @param reviewStartTime 评审提交时间
     * @param reviewEndTime 评审结束时间
     */
    void updateProject(ItemType itemType, String projectCiCode, List<PlanDesignInstance> plans, ArchReviewState state, String reviewId, String reviewStartTime, String reviewEndTime);

    /**
     * 根据流程id查询流程状态
     * @param processInstanceId
     * @return
     */
    ArchReviewRes getState(String processInstanceId);
}
